/**
 * 385. 迷你语法分析器
 * https://leetcode-cn.com/problems/mini-parser/
 */
public class Solutions_385 {
    public static void main(String[] args) {
//        String s = "324";
        String s = "[123,[456,[789]]]";
//        String s = "[[]]";  // output: [[]]
//        String s = "[-1]";  // output: [-1]

        NestedInteger res = deserialize(s);
        System.out.println(res);
    }

    /**
     * 解题思路：递归方式
     * 关键是要理解题意
     * 以 [123,[456,[789]]] 为例
     * 就是 NestedInteger 对象中
     * 有两个对象：
     * 1. 一个值为 123 的 NestedInteger 对象
     * 2. 一个嵌套列表为 [456,[789]] 的 NestedInteger 对象
     */
    private static int idx = 0;
    public static NestedInteger deserialize(String s) {
        char[] arr = s.toCharArray();

        idx = 0;
        NestedInteger obj = null;
        if (arr[0] != '[') {
            // 没有嵌套的情况，直接返回
            obj = new NestedInteger(Integer.parseInt(s));
        } else {
            obj = deserialize(arr);
        }
        return obj;
    }

    public static NestedInteger deserialize(char[] arr) {
        int num = 0;
        int flag = 1;
        NestedInteger cur = new NestedInteger();
        while (idx != arr.length - 1) {
            idx ++;
            if (arr[idx] == '[') {
                cur.add(deserialize(arr));
            } else if (arr[idx] == ']') {
                return cur;
            } else if (arr[idx] == ',') {
                continue;
            } else if (arr[idx] == '-') {
                flag = -1;
            } else {
                num = num * 10 + arr[idx] - '0';
//                if (!Character.isDigit(arr[idx + 1])) {
                // 数字后面一定还有 ']' 符号，不用担心索引越界
                if (arr[idx + 1] == ',' || arr[idx + 1] == ']') {
                    // 关键：不是直接调用 setInteger 方法，而是在 cur 中
                    // 添加一个以 num * flag 为值的 NestedInteger 对象
                    cur.add(new NestedInteger(num * flag));
                    flag = 1;
                    num = 0;
                }
            }
        }
        return null;
    }
}
